//1. 布尔类型
let b: boolean = true; //声明一个布尔类型的变量, 值为 true
let b2: boolean;// 声明一个布尔类型的变量
b2 = false;
// b2 = 'abc';

//2. 数字类型
let n:number = 10;
console.log(n);
let n2:number;
// n2 = 'abc';
let x: number = 0xff;
let x2: number = 3.1415926;
//变量可以重新复制, 但是类型必须匹配
n = 20;
let n3: number = Infinity;

//3. 字符串类型   双引号  反引号  
let str: string = 'i love you';
let str2: string;
str2 = 'i miss you';
// str2 = false;

//4. 字面量类型   『: 后边基本上都是类型』
let z: '123';// 声明了变量, 变量的值只允许为 '123'
z = '123';
let z2: 'LOVE' = 'LOVE';

//5. any    『面向 any 编程』
let a: any;
a = 100;
a = '123';
a = {}
a = []

//6. void   <a href="javascript: void(0)"></a>
let v: void;
v = undefined;
// v = null;
// v = 13;
function fn():void{
  return;
}

//7. never 永不   用的不多
function fn2():never{
  //结束代码运行
  throw new Error('出错了~~');
}

//8. object 类型
let o : object = {};
o = [1,2,3];//数组可以为对象类型赋值

//9. 数组 ts 建议将数组元素的类型设置为一样的
// let arr = [1,2,'1233121'];
//string[] 表明 arr 类型是一个字符串的数组
let arr: string[] = ['abc','xyz','hahahaha'];
arr.push('123');

//泛型 Array<number> 表明 arr2 的类型是一个数组, 且数组每个元素类型都为 number
let arr2: Array<number> = [1,2,3, 3.1415926];
arr2.push(520);

//10. 元组  用的比较少
let person: [string, number] = ['张三', 18];
let persons: [string, number][] = [
  ['茹月', 18],
  ['金凤', 18]
];

//11. 枚举  将一些值列出来
enum Gender{
  Female='女',
  Male='男',
  Secret='保密'
}

console.log(Gender);

let obj: object = {
  gender: Gender.Male
}

console.log(obj);

//12 联合类型
let v4: string | number;
v4 = 'loveyou';
v4 = 521;
// v4 = true;

//13 类型断言 
(async () => {
  //v 变量类型是 数字或者字符串
  let v: number | string;
  v = await new Promise((resolve) => {
    resolve(3.1415926);
  })
  //toFixed 数字类型的方法
  // v.toFixed(2) //error
  //方式一  as
  // console.log((v as number).toFixed(2));
  //方式二  <类型>
  console.log((<number>v).toFixed(2));
})()

//14. 类型推断
let t = 100; //类型推断 
// t = 'abc';

let xx;
xx = 100;
xx = 'abc';
xx = false;













//为了避免 ts 编译报错
export {}